/******************************************************************************************
Copyright(C), 2019-2020, Linyar.
文件名：L_MPP40_sys.c
作者：燕卫博	版本：V1.1	创建日期：2021.5.27
文件描述：
    对Hi3516DV300平台执行MPP系统初始化。
版本信息：
    9Hv2，个人。
历史修改记录：
1. 2021-5-27:V1.1 燕卫博
从STv9-t拷贝更改。

2. 2021-8-11:V1.0 燕卫博
从9Hv1拷贝，接续使用。
******************************************************************************************/
//                                              ↓
//+------------------------------------------------------------------------------------------+
//|                                          文件说明
//+------------------------------------------------------------------------------------------+
//+------------------------------------------------------------------------------------------+
//|  编写参考《HiMPP V4.0媒体处理软件开发参考(2019-8-1)》（简称《参考》）。
//+------------------------------------------------------------------------------------------+
//                                              ↓
//+------------------------------------------------------------------------------------------+
//|                                         头文件包含
//+------------------------------------------------------------------------------------------+
/*|*/  #include "L_MPP40_sys.h"
/*|*/  #include "L_MPP40_debug.h"
//+------------------------------------------------------------------------------------------+
//                                              ↓
//+------------------------------------------------------------------------------------------+
//|                                         参数宏定义
//+------------------------------------------------------------------------------------------+
//|    提供分辨率信息用于计算VB缓冲区大小
/*|*/  #define SENSOR_WIDTH  1920
/*|*/  #define SENSOR_HEIGHT 1080
//+------------------------------------------------------------------------------------------+

//+------------------------------------------------------------------------------------------+
//|  函数名称：L_MPP_SYS_Init
//|  功能描述：MPP4.0的初始化。
//|  参数说明：无
//|  返回值说明：成功返回0
//|  备注：
//+------------------------------------------------------------------------------------------+
int L_MPP_SYS_Init()
{
    HI_S32 s32Ret = HI_SUCCESS;
    //****************************************
    //计算并申请缓冲池其中u32MaxPoolCnt为整个
    //系统中可容纳缓冲池的个数，对于Hi3516CV500/
    //Hi3516DV300/Hi3559V200/Hi3556V200/
    //Hi3516EV200/Hi3516AV300，
    //该值最大为512。——《参考》P120
    //最大的公共视频缓冲池个数为16。即
    //astCommPool[]元素最大16。
    //——《参考》P149
    //建议整个结构体先memset为0再按需赋值。
    //——《参考》P157
    //****************************************
    VB_CONFIG_S stVbConf;
    memset(&stVbConf, 0, sizeof(VB_CONFIG_S));
    //----------------------------------------
    //Hi3516DV300的VGS支持对压缩和非压缩图像的
    //处理，所以VB初始化的时候不必一定设置为
    //非压缩格式，但应和后续设置保持一致。
    //----------------------------------------
    stVbConf.astCommPool[0].u64BlkSize = COMMON_GetPicBufferSize(SENSOR_WIDTH,
                                                               SENSOR_HEIGHT,
                                                               PIXEL_FORMAT_YVU_SEMIPLANAR_422,
                                                               DATA_BITWIDTH_8,
                                                               COMPRESS_MODE_SEG,
                                                               DEFAULT_ALIGN);
    stVbConf.astCommPool[0].u32BlkCnt  = 15;
    stVbConf.astCommPool[1].u64BlkSize = 768*576*2;//缓存块大小，以Byte为单位
    stVbConf.astCommPool[1].u32BlkCnt  = 1;//每个缓存池的缓存块个数，(0, 10240]
    stVbConf.u32MaxPoolCnt = VB_MAX_POOLS;
    //----------------------------------------
    //确保MPP业务在退出状态
    //----------------------------------------
    HI_MPI_SYS_Exit();
    HI_MPI_VB_Exit();
    //----------------------------------------
    //写入缓冲区信息到MPP并初始化
    //----------------------------------------
    do
    {
        s32Ret = HI_MPI_VB_SetConfig(&stVbConf);
        if(s32Ret != HI_SUCCESS){LOGE("[MPP-SYS-ERROR]HI_MPI_VB_SetConfig failed with %#x!\n", s32Ret);break;}

        s32Ret = HI_MPI_VB_Init();
        if(s32Ret != HI_SUCCESS){LOGE("[MPP-SYS-ERROR]HI_MPI_VB_Init failed with %#x!\n", s32Ret);break;}

        s32Ret = HI_MPI_SYS_Init();
        if(s32Ret != HI_SUCCESS){LOGE("[MPP-SYS-ERROR]HI_MPI_SYS_Init failed with %#x!\n", s32Ret);break;}

        return 0;
    }while(0);

    L_MPP_SYS_DeInit();
    return -1;
}

//+------------------------------------------------------------------------------------------+
//|  函数名称：L_MPP_SYS_DeInit
//|  功能描述：MPP4.0P的去初始化。
//|  参数说明：无
//|  返回值说明：成功返回0
//|  备注：
//+------------------------------------------------------------------------------------------+
void L_MPP_SYS_DeInit()
{
    HI_MPI_SYS_Exit();
    //----------------------------------------
    //VDEC模块公共池仅在解码*帧存分配方式*使用模块
    //公共VB池时才需要创建。
    //
    //此时需要先使用HI_MPI_VB_SetModPoolConfig函数
    //设置缓冲池，使用HI_MPI_VB_InitModCommPool函数
    //初始化，最后在HI_MPI_VB_Exit函数之前调用
    ///HI_MPI_VB_ExitModCommPool函数退出VDEC缓冲池。
    //该退出操作仅对VDEC有效，编码过程无需此步骤。
    //----------------------------------------
    //HI_MPI_VB_ExitModCommPool(VB_UID_VDEC);
    HI_MPI_VB_Exit();
}
